/*
 * CAnimationDB.h
 *
 *  Created on: 10.04.2012
 *      Author: Caffeine
 */

#ifndef ANIMATIONDB_H_
#define ANIMATIONDB_H_
#include <irrlicht.h>
#include <lampe/animation/IAnimation.h>
#include <lampe/animation/IAnimationDB.h>
#include "CAnimation.h"
namespace lampe{
namespace animation{


/***
 * @class CAnimationDB
 * Хранит все группы анимаций
 */
class CAnimationDB:public virtual IAnimationDB{
private:
	irr::core::array<CAnimation*>list;
	irr::scene::ISceneManager*smgr;
public:
	/***
	* Добовляет группу анимаций в БД анимаций
	*
	* @param animation группа анмаций, которую нужно добавить в БД анимаций
	* @return номер добавленной группы анимаций
	* */
	virtual irr::u32 addAnimation(IAnimation*animation);
	
	/***
	* Добовляет группу анимаций в БД анимаций
	*
	* @param animation группа анмаций, которую нужно добавить в БД анимаций
	* @return номер добавленной группы анимаций
	* */
    virtual irr::u32 addAnimation(lampe::String animation_name);
	
	/***
	* Удаляет группу анимаций из БД анимаций по её номеру
	*
	* @param index номер группы анимаций, которую нужно удалить
	* */
	virtual void removeAnimationByIndex(irr::u32 index);
	
	/***
	* Удаляет группу анимайи из БД анимаций по её имяни
	*
	* @param name имя группы анимаций
	* */
    virtual void removeAnimationByName(lampe::String name);
	
	/***
	* Ищет номер группы анимаций по её имяни и возвращяет его
	*
	* @param name
	* @return номер анимации с имянем name. Если не найдено, то вернёт -1
	* */
    virtual irr::s32 indexOfByName(lampe::String name);
	
	/***
	* Ищет номер группы анимаций по объекту анимации и возвращяет его
	*
	* @param animation объект анимации, номер которой нужно найти
	* @return номер группы анимаций в списке БД. Если не найдено, то венёт NULL
	* */
	virtual irr::s32 indexOfAnimation(IAnimation*animation);
	
	/***
	* Возвращяет группу анимаций по её номеру
	*
	* @param index номер группы анимаций
	* @return анимация с номером index. Если не найдена, то вернёт NULL
	* */
	virtual IAnimation*getByIndex(irr::u32 index);
	
	/***
	* Возвращяет группу анимаций по её имяни
	*
	* @param name имя группы анимаций
	* @return анимация с имянем name. Если не найдена, то вернёт NULL
	* */
    virtual IAnimation*getByName(lampe::String name);
	
	/***
	* Применяет указанную анимацию к модели. Может работать медленно,
	* потому что при каждом вызове нужная анимация ищется заново.
	* Возможно лучше было бы получить указатели на нужные анимации
	* и вызывать их напрямую
	*
	* @param group имя группы анимаций
	* @param name название анимации
	* @param node узел, к которому нужно применить анимацию
	* */
    virtual void useFor(lampe::String group,lampe::String name,irr::scene::IAnimatedMeshSceneNode*node);
	
	CAnimationDB(irr::scene::ISceneManager*smgr);
	virtual ~CAnimationDB();
};

}//namespace animation
}//namespace irr

#endif /* ANIMATIONDB_H_ */
